#!/usr/bin/env node

const { execSync } = require("child_process");
const fs = require("fs");
const path = require("path");
const cfg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "config.json"), "utf8"));

const rmDirOpt = { recursive: true, focus: true };

// 批量处理指定目录下的所有mp3文件
function runVideoBatch(folderName) {
  console.log(`开始批量处理目录: ${folderName}`);

  // 构建输入目录路径
  const mp3Dir = path.join(__dirname, "..", cfg.inputDirMp3, folderName);
  const datDir = path.join(__dirname, "..", cfg.inputDirDat, folderName);

  // 检查目录是否存在
  if (!fs.existsSync(mp3Dir)) {
    console.error(`！！！错误: MP3目录不存在: ${mp3Dir}`);
    process.exit(1);
  }

  if (!fs.existsSync(datDir)) {
    console.error(`！！！错误: DAT目录不存在: ${datDir}`);
    process.exit(1);
  }

  // 获取所有mp3文件
  const mp3Files = fs
    .readdirSync(mp3Dir)
    .filter(file => path.extname(file) === ".mp3")
    .sort();

  if (mp3Files.length === 0) {
    console.log(`目录 ${mp3Dir} 中没有找到MP3文件`);
    process.exit(0);
  }

  console.log(`找到 ${mp3Files.length} 个MP3文件`);

  // 创建输出目录
  const outputDir = path.join(__dirname, "..", cfg.outputDirVideo, folderName);
  if (!fs.existsSync(outputDir)) {
    fs.mkdirSync(outputDir, { recursive: true });
  }
  // 清理图片目录
  let pt = cfg.inputDirImages;
  fs.existsSync(pt) && fs.rmdirSync(pt, rmDirOpt);
  pt = cfg.outputDirSrt;
  fs.existsSync(pt) && fs.rmdirSync(pt, rmDirOpt);
  pt = cfg.outputDirVideo;
  fs.existsSync(pt) && fs.rmdirSync(pt, rmDirOpt);

  // 处理每个mp3文件
  for (let i = 0; i < mp3Files.length; i++) {
    const mp3File = mp3Files[i];
    const fileNameWithoutExt = path.basename(mp3File, ".mp3");

    console.log(`\n[${i + 1}/${mp3Files.length}] 处理文件: ${mp3File}`);

    try {
      // 清理临时目录（但保留图片目录，直到视频创建完成）
      let pt1 = cfg.outputDirSrt;
      fs.existsSync(pt1) && fs.rmdirSync(pt1, rmDirOpt);

      // Step 1: 生成字幕文件
      console.log("  步骤 1/3: 生成字幕文件...");
      const datFile = `${fileNameWithoutExt}.dat`;
      const datFilePath = path.join(datDir, datFile);

      if (!fs.existsSync(datFilePath)) {
        console.error(`！！！  跳过: 对应的DAT文件不存在: ${datFile}`);
        continue;
      }

      // 直接使用原始DAT文件路径，而不是复制到固定位置
      console.log(`  使用原始DAT文件: ${datFilePath}`);

      // 转换dat到ass，传递原始DAT文件路径
      console.log("  执行字幕转换...");
      execSync(`node src/convert_all.js "${datFilePath}"`, { stdio: "inherit" });

      // Step 2: 下载图片
      console.log("  步骤 2/3: 下载图片...");
      // 使用原始文件名而不是"1"来下载图片
      execSync(`node src/download_images.js "${fileNameWithoutExt}" 100`, { stdio: "inherit" });

      // Step 3: 创建视频
      console.log("  步骤 3/3: 创建视频...");
      const outputVName = `${fileNameWithoutExt}.mp4`;

      // 使用原始MP3文件路径，而不是复制到固定位置
      const sourceMp3Path = path.join(mp3Dir, mp3File);
      console.log(`  使用原始MP3文件: ${sourceMp3Path}`);

      // 设置自定义标题：文件夹名 + 文件名
      const customTitle = `${folderName}\n(${fileNameWithoutExt})`;
      const titleFilePath = path.join(__dirname, "../temp/", "temp_title.txt");
      console.log(`  设置视频标题: ${customTitle}`);
      fs.writeFileSync(titleFilePath, customTitle, "utf-8");

      // 直接传递原始文件路径给create_video.js，并确保使用DAT时长
      // 使用fileNameWithoutExt作为字幕编号，与convert_all.js生成的ASS文件名匹配
      execSync(`node src/create_video.js "${sourceMp3Path}" "${fileNameWithoutExt}" -a -o "${outputVName}" --use-dat-duration`, { stdio: "inherit" });

      // 移动视频到正确的输出目录
      const dirVideo = cfg.outputDirVideo;
      const sourceVideoPath = path.join(__dirname, "..", dirVideo, outputVName);
      const targetVideoPath = path.join(outputDir, outputVName);
      if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir);
      if (fs.existsSync(sourceVideoPath)) {
        fs.copyFileSync(sourceVideoPath, targetVideoPath);
        console.log(`  视频已保存到: ${targetVideoPath}`);
      } else {
        console.error(`！！！  错误: 视频文件未生成: ${sourceVideoPath}`);
      }

      // 清理临时标题文件
      fs.existsSync(titleFilePath) && fs.unlinkSync(titleFilePath);

      // 视频创建完成后清理图片目录
      let pt = cfg.inputDirImages;
      fs.existsSync(pt) && fs.rmdirSync(pt, rmDirOpt);
    } catch (error) {
      console.error(`！！！  处理文件时出错: ${error.message}`);
      // 出错时也清理图片目录，避免影响下一个文件的处理
      let pt = cfg.inputDirImages;
      fs.existsSync(pt) && fs.rmdirSync(pt, rmDirOpt);
    }
  }

  console.log("\n✅ 批量处理完成！");
}

module.exports = { runVideoBatch };
